#include "my_xmodem.h"

/**
 * @brief 发送一个 XMODEM 数据包
 *
 * @param pXmod XMODEM 数据包结构体指针
 * @param packet_number 数据包序号
 * @param packet_remain 剩余数据长度
 * @param send_buf 发送缓冲区指针
 *
 * @details 该函数用于组装 XMODEM 数据包，包括:
 *          - 设置包序号和反序号
 *          - 填充剩余空间(如果有)
 *          - 计算校验和
 *          - 将所有数据组装到发送缓冲区
 */
static void send_xmodem_packet(xmodem_packet_t *pXmod, size_t packet_number, size_t packet_remain, char *send_buf)
{
	// char send_buf[XMODEM_PACKET_SIZE + 4];
	pXmod->packet_number = packet_number;
	pXmod->packet_number_c = ~packet_number;

	if(packet_remain != 0)
		memset(pXmod->data + packet_remain,0x1a,XMODEM_PACKET_SIZE - packet_remain);

	pXmod->check = check_sum(pXmod->data,XMODEM_PACKET_SIZE);

	*send_buf = pXmod->header; 
	*(send_buf + 1) = pXmod->packet_number; 
	*(send_buf + 2) = pXmod->packet_number_c; 
	memcpy(send_buf + 3,pXmod->data,XMODEM_PACKET_SIZE);
	*(send_buf + XMODEM_PACKET_SIZE + 3) = pXmod->check; 
	
    // uart_write(send_buf,XMODEM_PACKET_SIZE + 4);

	// for(int i=0;i< XMODEM_PACKET_SIZE + 4;i++){
	// 	printf("%02x ",send_buf[i]);
	// }
	// printf("\n");
}

/**
 * @brief 从文件中读取数据并打包成 XMODEM 数据包
 *
 * @param file 输入文件指针
 * @param xmodem_packet XMODEM数据包结构体指针
 * @param packet_num 数据包序号
 * @param buf 数据缓冲区
 *
 * @details 该函数从文件中读取固定大小的数据块,并将其打包成XMODEM格式的数据包。
 *          当packet_num为-1时重置内部状态。函数使用静态变量跟踪文件读取位置,
 *          避免重复读取相同数据。读取的数据通过send_xmodem_packet函数发送。
 */
void get_xmodem_buf(FILE *file, xmodem_packet_t *xmodem_packet, size_t packet_num, char *buf)
{
	static size_t file_data_size;
	static size_t num_flag = 0;

	if(packet_num > num_flag)
    {
		num_flag = packet_num;
		fseek(file,0,SEEK_CUR);
    	file_data_size = fread(xmodem_packet->data,1,XMODEM_PACKET_SIZE,file);
	}

	if(packet_num == -1){
		file_data_size = 0;
		num_flag = 0;
		return;
	}
    send_xmodem_packet(xmodem_packet,packet_num,file_data_size,buf);
}
